
#include "platform.h"
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "osd.h"
#include "gpio.h"
#include "camera.h"
#include "keythread.h"
#include "queue.h"
#include "camera_thread.h"
#include "mainwindow_thread.h"
#include "rs485_uart.h"
#include "rtsp/rtsp_server.h"

//==================================================================================================
//  信号处理函数;
//==================================================================================================
HI_VOID PROGRAM_EXIT_HandleSig(HI_S32 signo)
{
    printf("\033[0;31mprogram exit abnormally!\033[0;39m\n");
    camera_deinit();
    exit(0);
}


//==================================================================================================
//  timer
//==================================================================================================
void Msleep(unsigned int MilliSecond)
{
	struct timeval time;
	time.tv_sec = MilliSecond / 1000;                  //seconds
	time.tv_usec = MilliSecond % 1000 * 1000;          //microsecond
	select(0, NULL, NULL, NULL, &time);
}

//==================================================================================================
//  Main code
//==================================================================================================
int main(int argc, char **argv)
{
    pthread_t tid1,tid2,tid3;
    system("himm 0x111F_0008 0x1 >/dev/null");
    system("himm 0x111F_000C 0x1 >/dev/null");
    camera_init();
    rs485_uart_init();
    rtsp_init();
    pthread_create(&tid1, 0, keythread_run,     NULL);  //按键(uart)线程函数
    pthread_create(&tid2, 0, camera_run,        NULL);  //摄像头线程函数
    pthread_create(&tid3, 0, mainwindow_run,    NULL);  //界面处理线程,带有3个子线程

    //信号处理函数
    signal(SIGINT,  PROGRAM_EXIT_HandleSig);            //由Interrupt Key产生，通常是CTRL+C或者DELETE。
    signal(SIGTERM, PROGRAM_EXIT_HandleSig);            //SIGTERM :请求中止进程，kill命令缺省发送;

    while(1)
    {
        Msleep(10);
        //usleep(10000);
    }
	return 0;
}


